package com.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;

public class MyRealmMD5SaltHash extends AuthorizingRealm {

    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }

    // 认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //拿到用户输入的账号密码
        String userName = (String) token.getPrincipal();

        String password = new String((char[]) token.getCredentials());

        //通过userName到数据库中查询密码
        // 根据用户输入的用户去数据库中查询密码 这一步没法省略的 shiro是做不了的 虽然JdbcRealm 但是也是自定义的realm
        String password_db = getPasswordByUserName(userName);

        //将数据库查询的密码放到SimpleAuthenticationInfo shiro会自己调用加密算法 和用户输入的密码进行比对
        //将加密算法的盐值放进去 供后面使用
        //ByteSource.Util.bytes:是因为我们使用的shiro的MD5加密算法 他内部调用了ByteSource.Util.bytes进行加密
        //所以我们在构造 SimpleAuthenticationInfo 的时候也需要加上ByteSource.Util.bytes
        return new SimpleAuthenticationInfo(userName,password_db, ByteSource.Util.bytes("mySalt"),getName());
    }

    /**
     * 这个密码目前是加盐的密文
     * @param userName
     * @return
     */
    public String getPasswordByUserName(String userName){
        return "5930e7b52598c68776259c15a274b1ef";
    }

}
